iOS অ্যাপ্লিকেশনে Background Tasks এবং Concurrent Programming হলো গুরুত্বপূর্ণ টেকনিক, যা ব্যবহার করে অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে কাজ চালাতে পারে এবং পারফরমেন্স উন্নত করে। iOS এ, Background Tasks সাধারণত ব্যাকগ্রাউন্ডে লং-রানিং টাস্ক, নেটওয়ার্ক রিকোয়েস্ট, ফাইল ডাউনলোড বা আপলোড, এবং অন্যান্য হেভি প্রসেসিং অপারেশন পরিচালনা করতে ব্যবহৃত হয়। Concurrent Programming এর মাধ্যমে আমরা একই সাথে একাধিক টাস্ক চালাতে পারি, যা অ্যাপ্লিকেশনের রেসপন্সিভনেস এবং পারফরমেন্স বৃদ্ধি করে।
Background Tasks
iOS এ Background Tasks ব্যবহার করার জন্য Apple কয়েকটি টেকনোলজি এবং API প্রদান করেছে, যা ব্যাকগ্রাউন্ডে কাজ করতে সহায়ক:
- Background Fetch: এটি একটি ব্যাকগ্রাউন্ড মেকানিজম, যা ব্যাকগ্রাউন্ডে ডেটা রিফ্রেশ করে। এটি এমন অ্যাপগুলির জন্য উপযুক্ত যেগুলো নির্দিষ্ট সময় অন্তর ডেটা আপডেট করে, যেমন: নিউজ ফিড।
- URLSession Background Configuration: iOS এ URLSession API ব্যাকগ্রাউন্ডে ফাইল ডাউনলোড এবং আপলোড পরিচালনা করতে পারে। এটি বড় ফাইল বা লং-রানিং ডাউনলোড/আপলোডের জন্য উপযুক্ত।
- BGTaskScheduler: iOS 13 থেকে, Apple BGTaskScheduler API প্রদান করেছে, যা ব্যাকগ্রাউন্ডে কাজ পরিচালনা করতে এবং শিডিউল করতে সহায়ক। এটি ব্যাটারি এবং রিসোর্সের ওপর ভিত্তি করে টাস্ক শিডিউল করে।
- Silent Push Notifications: Silent Push Notifications এর মাধ্যমে সার্ভার থেকে অ্যাপকে ব্যাকগ্রাউন্ডে ডেটা আপডেট করার নির্দেশ দেয়া যেতে পারে, ব্যবহারকারীর নোটিফিকেশন ছাড়াই।
উদাহরণ: Background Fetch ব্যবহার করা
Background Fetch কনফিগার করার জন্য কিছু স্টেপ ফলো করতে হবে:
Step 1: Background Mode সক্ষম করা
Xcode এ Capabilities ট্যাব থেকে Background Modes চালু করুন এবং Background Fetch অপশনটি সিলেক্ট করুন।
Step 2: App Delegate এ কনফিগার করা
Background Fetch কনফিগার করতে AppDelegate এ নিচের মতো কোড যোগ করুন:
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Background Fetch এর জন্য ইন্টারভাল সেট করা
application.setMinimumBackgroundFetchInterval(UIApplication.backgroundFetchIntervalMinimum)
return true
}
func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// ডেটা ফেচ বা আপডেট করা
fetchDataInBackground { newData in
if newData {
completionHandler(.newData)
} else {
completionHandler(.noData)
}
}
}
// ব্যাকগ্রাউন্ডে ডেটা ফেচ করার একটি ফাংশন
func fetchDataInBackground(completion: @escaping (Bool) -> Void) {
// এখানে নেটওয়ার্ক রিকোয়েস্ট বা ডেটা প্রসেসিং যুক্ত করুন
completion(true) // এখানে নতুন ডেটা এসেছে কিনা তা রিটার্ন করুন
}
}
ব্যাখ্যা:
- setMinimumBackgroundFetchInterval: এই মেথড দিয়ে Background Fetch ইন্টারভাল সেট করা হয়।
- performFetchWithCompletionHandler: এটি ব্যাকগ্রাউন্ডে ফেচ টাস্ক চালানোর জন্য ব্যবহৃত হয়। এখানে আমরা
fetchDataInBackgroundফাংশন কল করেছি।
উদাহরণ: URLSession দিয়ে Background Download
iOS এ URLSession ব্যবহার করে বড় ফাইল ডাউনলোড করতে হলে Background Configuration ব্যবহার করা হয়:
import UIKit
class DownloadManager: NSObject, URLSessionDownloadDelegate {
var downloadSession: URLSession!
override init() {
super.init()
let configuration = URLSessionConfiguration.background(withIdentifier: "com.example.download")
downloadSession = URLSession(configuration: configuration, delegate: self, delegateQueue: nil)
}
func startDownload() {
guard let url = URL(string: "https://example.com/largefile.zip") else { return }
let downloadTask = downloadSession.downloadTask(with: url)
downloadTask.resume()
}
// URLSession Download Delegate মেথড
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
print("Download completed: \(location)")
// ফাইল প্রক্রিয়াকরণ বা সংরক্ষণ করুন
}
}
ব্যাখ্যা:
- Background Configuration:
URLSessionConfiguration.backgroundব্যবহার করে একটি ব্যাকগ্রাউন্ড সেশন কনফিগার করা হয়েছে। - startDownload: ডাউনলোড শুরু করার জন্য একটি ফাংশন।
- Delegate মেথড: ডাউনলোড কমপ্লিট হলে
urlSession(_:downloadTask:didFinishDownloadingTo:)মেথড ট্রিগার হয়।
BGTaskScheduler ব্যবহার করে Background Processing
iOS 13 থেকে, Apple BGTaskScheduler API প্রদান করেছে, যা ব্যাকগ্রাউন্ডে লং-রানিং টাস্ক পরিচালনা করতে সহায়ক। এটি ব্যাটারি এবং রিসোর্স ব্যবস্থাপনার সাথে কাজ করে।
Step 1: Info.plist এ সেটআপ করা
Info.plist এ নিচের এন্ট্রি যুক্ত করুন:
- BGTaskSchedulerPermittedIdentifiers হিসেবে আপনার টাস্ক আইডেন্টিফায়ার যোগ করুন, যেমন:
com.example.refresh.
Step 2: BGTaskScheduler সেটআপ করা
import BackgroundTasks
func scheduleAppRefresh() {
let request = BGAppRefreshTaskRequest(identifier: "com.example.refresh")
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60) // 15 মিনিট পরে
do {
try BGTaskScheduler.shared.submit(request)
} catch {
print("Failed to schedule app refresh: \(error)")
}
}
func handleAppRefresh(task: BGAppRefreshTask) {
scheduleAppRefresh() // পুনরায় শিডিউল করা
// ব্যাকগ্রাউন্ডে ডেটা ফেচ
fetchDataInBackground { success in
task.setTaskCompleted(success: success)
}
}
func fetchDataInBackground(completion: @escaping (Bool) -> Void) {
// নেটওয়ার্ক কল বা ডেটা প্রসেসিং
completion(true)
}
Concurrent Programming: Multithreading এবং GCD ব্যবহার করে
Concurrent Programming এর মাধ্যমে আমরা একসাথে একাধিক টাস্ক চালাতে পারি। GCD (Grand Central Dispatch) হলো এর প্রধান উপায়। নিচে উদাহরণ দেওয়া হলো:
উদাহরণ: Concurrent Queue এ টাস্ক চালানো
let concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)
concurrentQueue.async {
for i in 1...5 {
print("Concurrent Task 1: \(i)")
}
}
concurrentQueue.async {
for i in 1...5 {
print("Concurrent Task 2: \(i)")
}
}
ব্যাখ্যা:
- Concurrent Queue: এটি একসাথে একাধিক টাস্ক চালায়।
- async: টাস্কগুলো প্যারালালে একসাথে চালানো হয়।
GCD ব্যবহার করে Operation Queues
iOS এ Operation Queues আরও উচ্চ স্তরের টাস্ক ম্যানেজমেন্ট প্রদান করে, যা GCD এর উপরে নির্মিত। এটি নির্ভরতা (dependencies) এবং কাস্টম কনকারেন্সি পরিচালনা করতে পারে।
উদাহরণ: Operation Queue ব্যবহার করা
let operationQueue = OperationQueue()
let operation1 = BlockOperation {
print("Operation 1 started")
sleep(2)
print("Operation 1 finished")
}
let operation2 = BlockOperation {
print("Operation 2 started")
sleep(1)
print("Operation 2 finished")
}
// operation2 কে operation1 এর উপর নির্ভরশীল করা
operation2.addDependency(operation1)
operationQueue.addOperation(operation1)
operationQueue.addOperation(operation2)
ব্যাখ্যা:
- BlockOperation: দুটি ব্লক অপারেশন তৈরি করা হয়েছে।
- Dependency:
operation2কেoperation1এর উপর নির্ভরশীল করা হয়েছে, তাইoperation1শেষ না হলেoperation2শুরু হবে না।
Background Tasks এবং Concurrent Programming এর সেরা চর্চা
- Main Queue এবং Background Queue আলাদা করুন: ব্যাকগ্রাউন্ড প্রসেসিং সবসময় ব্যাকগ্রাউন্ড কিউতে করুন এবং UI আপডেট সবসময় মুল থ্রেডে করুন।
- Error Handling নিশ্চিত করুন: ব্যাকগ্রাউন্ড টাস্কে এরর হ্যান্ডলিং নিশ্চিত করুন এবং প্রয়োজনমতো রিট্রাই লজিক ব্যবহার করুন।
- Battery এবং Resource Optimization: ব্যাকগ্রাউন্ড টাস্কে ব্যাটারি এবং রিসোর্স ম্যানেজমেন্টের জন্য BGTaskScheduler ব্যবহার করুন।
- Efficient Data Fetching: Background Fetch বা Silent Push Notifications ব্যবহার করে ব্যাকগ্রাউন্ডে ডেটা রিফ্রেশ করুন।
উপসংহার
iOS এ Background Tasks এবং Concurrent Programming ব্যবহার করে অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে কাজ করতে এবং পারফরমেন্স উন্নত করতে পারা যায়। GCD, URLSession, এবং BGTaskScheduler ব্যবহার করে ডেভেলপাররা ব্যাকগ্রাউন্ড এবং কনকারেন্ট টাস্ক ম্যানেজ করতে পারেন, যা অ্যাপকে আরও রেসপন্সিভ এবং পারফরমেন্স-ওরিয়েন্টেড করে তোলে।
Read more